#Datensatz einlesen
df_original <- read.csv("https://swissvotes.ch/page/dataset/swissvotes_dataset.csv", header=TRUE, sep=";", na = c("NA", "."))
#Datensatz anschauen
head(df_original)
str(df_original)
'data.frame': 676 obs. of 834 variables:
$ anr : num 1 2 3 4 5 6 7 8 9 10 ...
$ datum : chr "12.09.1848" "14.01.1866" "14.01.1866" "14.01.1866" ...
$ titel_kurz_d : chr "Bundesverfassung der schweizerischen Eidgenossenschaft" "Mass und Gewicht" "Gleichstellung der Juden und Naturalisierten mit Bezug auf Niederlassung" "Stimmrecht der Niedergelassenen in Gemeindeangelegenheiten" ...
$ titel_kurz_f : chr "Constitution f\xe9d\xe9rale de la Conf\xe9d\xe9ration suisse" "Poids et mesures" "Egalit\xe9 des Juifs" "Droit de vote des Suisses \xe9tablis, en mati\xe8re communale" ...
$ titel_off_d : chr "Totalrevision vom 12. September 1848" "Festsetzung von Mass und Gewicht" "Gleichstellung der Juden und Naturalisierten mit Bezug auf Niederlassung" "Stimmrecht der Niedergelassenen in Gemeindeangelegenheiten" ...
$ titel_off_f : chr "R\xe9vision totale du 12 septembre 1848" "Poids et mesures" "Egalit\xe9 des citoyens au point de vue de l'\xe9tablissement et de la l\xe9gislation" "Droit de vote des Suisses \xe9tablis, en mati\xe8re communale" ...
$ stichwort : chr NA NA NA NA ...
$ swissvoteslink : chr "https://swissvotes.ch/vote/1.00" "https://swissvotes.ch/vote/2.00" "https://swissvotes.ch/vote/3.00" "https://swissvotes.ch/vote/4.00" ...
$ anzahl : int 1 9 9 9 9 9 9 9 9 9 ...
$ rechtsform : int 1 1 1 1 1 1 1 1 1 1 ...
$ kurzbetitel : chr "Die Gr\xfcndung des schweizerischen Bundesstaates 1848" "Wegen des St\xe4ndemehrs: Ein 'Schoppen' bleibt ein 'Schoppen'" "Das einzige Ja von 1866: Freie Niederlassung f\xfcr Juden" "Kantonsfremde Niedergelassene bleiben benachteiligt" ...
$ anneepolitique : chr "" "" "" "" ...
$ bkchrono.de : chr "" "" "" "" ...
$ bkchrono.fr : chr "" "" "" "" ...
$ d1e1 : int 1 1 12 1 6 1 12 1 4 4 ...
$ d1e2 : num 1.2 1.5 12.3 1.4 6.1 1.4 12.3 1.6 4.1 4.1 ...
$ d1e3 : num 1.21 1.52 NA 1.43 6.12 1.43 NA 1.65 4.12 4.13 ...
$ d2e1 : int 1 NA 1 1 1 1 1 1 12 4 ...
$ d2e2 : num 1.5 NA 1.6 1.6 1.6 1.6 1.6 1.5 12.1 4.4 ...
$ d2e3 : num 1.52 NA 1.62 1.62 1.62 1.62 1.62 1.52 NA 4.43 ...
$ d3e1 : int NA NA 1 1 1 1 NA 1 1 NA ...
$ d3e2 : num NA NA 1.5 1.5 1.5 1.5 NA 1.6 1.5 NA ...
$ d3e3 : num NA NA 1.52 1.52 1.52 1.52 NA 1.62 1.52 NA ...
$ dep : int NA NA 3 NA NA NA NA NA NA NA ...
$ br.pos : int 3 NA NA NA NA NA NA NA NA NA ...
$ legislatur : int 1 6 6 6 6 6 6 6 6 6 ...
$ legisjahr : chr "1848-1851" "1863-1866" "1863-1866" "1863-1866" ...
$ gesch_nr : chr NA NA NA NA ...
$ curiavista.de : chr "" "" "" "" ...
$ curiavista.fr : chr "" "" "" "" ...
$ bv.pos : int 3 1 1 1 1 1 1 1 1 1 ...
$ nr.pos : int 3 1 1 1 1 1 1 1 1 1 ...
$ nrja : int NA NA NA NA NA NA NA NA NA NA ...
$ nrnein : int NA NA NA NA NA NA NA NA NA NA ...
$ sr.pos : int 3 1 1 1 1 1 1 1 1 1 ...
$ srja : int NA NA NA NA NA NA NA NA NA NA ...
$ srnein : int NA NA NA NA NA NA NA NA NA NA ...
$ dat.preexam : chr "0" "0" "0" "0" ...
$ dat.start : chr "0" "0" "0" "0" ...
$ dat.limit : chr "00.01.1900" "00.01.1900" "00.01.1900" "00.01.1900" ...
$ sammelfrist : int 0 0 0 0 0 0 0 0 0 0 ...
$ unter.quorum : int 0 0 0 0 0 0 0 0 0 0 ...
$ dat.submit : chr "0" "0" "0" "0" ...
$ dat.success : chr "0" "0" "0" "0" ...
$ dat.message : chr NA "01.07.1865" "01.07.1865" "01.07.1865" ...
$ dat.parl : chr NA "19.11.1865" "19.11.1865" "19.11.1865" ...
$ dat.force : chr NA "0" NA "0" ...
$ dauer_bv : int NA NA NA NA NA NA NA NA NA NA ...
$ dauer_abst : int NA NA NA NA NA NA NA NA NA NA ...
$ i.dauer_tot : int NA NA NA NA NA NA NA NA NA NA ...
$ i.dauer_samm : int NA NA NA NA NA NA NA NA NA NA ...
$ i.dauer_br : int NA NA NA NA NA NA NA NA NA NA ...
$ fr.dauer_samm : int NA NA NA NA NA NA NA NA NA NA ...
$ fr.dauer_tot : int NA NA NA NA NA NA NA NA NA NA ...
$ unter_g : int NA NA NA NA NA NA NA NA NA NA ...
$ unter_u : int NA NA NA NA NA NA NA NA NA NA ...
$ urheber : chr NA NA NA NA ...
$ info_br.de : chr "" "" "" "" ...
$ info_br.fr : chr "" "" "" "" ...
$ info_br.en : chr "" "" "" "" ...
$ info_dep.de : chr "" "" "" "" ...
$ info_dep.fr : chr "" "" "" "" ...
$ info_dep.en : chr "" "" "" "" ...
$ info_amt.de : chr "" "" "" "" ...
$ info_amt.fr : chr "" "" "" "" ...
$ info_amt.en : chr "" "" "" "" ...
$ p.fdp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.sps : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.svp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.mitte : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.evp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.gps : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.glp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.ucsp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.pda : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.sd : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.edu : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.fps : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.lega : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.kvp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.mcg : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.cvp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.bdp : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.lps : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.ldu : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.poch : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.rep : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.eco : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.sgv : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.sbv : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.sgb : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.travs : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.sav : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.vsa : int 9999 9999 9999 9999 9999 9999 9999 9999 9999 9999 ...
$ p.vpod : int NA NA NA NA NA NA NA NA NA NA ...
$ p.voev : int NA NA NA NA NA NA NA NA NA NA ...
$ p.tcs : int NA NA NA NA NA NA NA NA NA NA ...
$ p.vcs : int NA NA NA NA NA NA NA NA NA NA ...
$ p.acs : int NA NA NA NA NA NA NA NA NA NA ...
[list output truncated]
#Variablen definieren um nachher mehrere Spalten gleichzeitig zu mutieren
positionen <- df_original %>%
select(ends_with(".pos")|starts_with("p.")|starts_with("pdev"))
hauptthema <- df_original %>%
select(d1e1, d2e1 ,d3e1)
unterthema <- df_original %>%
select(d1e2, d2e2 ,d3e2)
unterunterthema <- df_original %>%
select(d1e3, d2e3 ,d3e3)
daten <- df_original%>%
select(datum, starts_with("dat."))
resultate <- df_original %>%
select(ends_with("annahme")| volk | stand)
parteien <- c(".svp", ".fdp", ".sp", ".cvp", ".gsp", ".sps")
#Data-Wrangling (Variablen codieren)
data <- df_original %>%
# filter((d1e2 > 2 & d1e2 < 4 | (d1e3 > 10.30 & d1e3 < 10.33)) |
# (d2e2 > 2 & d2e2 < 4 | (d2e3 > 10.30 & d2e3 < 10.33))|
# (d3e2 > 2 & d3e2 < 4 | (d3e3 > 10.30 & d3e3 < 10.33)) ) %>% #Filter der Themengebiete
select(-(ends_with(".fr")|ends_with("_f")|ends_with(".en")))%>% #Entfernung französische Übersetzungen
rename(Kurztitel = titel_kurz_d, Titel = titel_off_d, ) %>%
mutate(rechtsform = factor(case_when(
rechtsform == 1 ~ "Obligatorisches Referendum",
rechtsform == 2 ~ "Fakultatives Referendum",
rechtsform == 3 ~ "Volksinitiative",
rechtsform == 4 ~ "Gegenentwurf zu Volksinitiative",
rechtsform == 5 ~ "Stichfrage")))%>%
mutate(dep = factor(case_when(
dep == 1 ~ "EDA",
dep == 2 ~ "EDI",
dep == 3 ~ "EJPD",
dep == 4 ~ "VBS",
dep == 5 ~ "EFD",
dep == 6 ~ "WBF",
dep == 7 ~ "UVEK",
dep == 8 ~ "BK")))%>%
mutate (Jahr = as.integer(format(as.Date(datum, format='%d.%m.%Y'), format="%Y"))) %>%
mutate(across(names(positionen),
~ factor(case_when(. == 1 ~ "Befürwortend",
.== 2 ~"Ablehnend",
.== 3 ~"Keine",
.== 4 ~"Leere Abgabe",
.== 5 ~"Stimmfreigabe",
.== 8 ~"Vorzug für den Gegenentwurf",
.== 9 ~"Vorzug für Volksinitiative",
. == 66 ~"keine",
. == 9999 ~"Partei ex. nicht",)))) %>%
mutate(across(names(hauptthema),
~ factor(case_when(. == 1 ~ "Staatsordnung",
.== 2 ~ "Aussenpolitik",
.== 3 ~"Sicherheitspolitik",
.== 4 ~"Wirtschaft",
.== 5 ~"Landwirtschaft",
.== 6 ~"Öffentliche Finanzen",
.== 7 ~"Energie",
.== 8 ~"Verkehr und Infrastruktur",
.== 9 ~"Umwelt und Lebensraum",
.== 10 ~"Sozialpolitik",
.== 11 ~"Bildung und Forschung",
.== 12 ~"Kultur, Religion, Medien",))))%>%
mutate(across(names(unterthema),
~ factor(case_when(. == 2.1 ~ "Aussenpolitische Grundhaltung",
.== 2.2 ~ "Europapolitik",
.== 2.3 ~ "Internationale Organisationen",
.== 2.4 ~ "Entwicklungszusammenarbeit",
.== 2.5 ~ "Staatsverträge mit einzelnen Staaten",
.== 2.6 ~"Aussenwirtschaftspolitik",
.== 2.7 ~"Diplomatie",
.== 2.8 ~"Auslandschweizer:innen",
.== 3.1 ~"Öffentliche Sicherheit",
.== 3.2 ~"Armee",
.== 3.3 ~"Landesversorgung",
.== 10.3 ~"Ausländer & Flüchtlinge",
TRUE ~"andere")))) %>%
mutate(across(names(unterunterthema),
~ factor(case_when(. == 10.31 ~ "Ausländerpolitik",
.== 10.32 ~ "Flüchtlinge",
TRUE ~"andere")))) %>%
#mutate(across(names(daten),
# ~ as.Date(., "%d.%m.%Y"))) %>%
mutate(across(names(resultate),
~ factor(case_when(. == 0 ~"abgelehnt",
.== 1 ~ "angenommen",
.== 3 ~ "Ständemehr nicht nötig",
.== 8 ~ "Gegenentwurf angenommen",
.== 9 ~ "Volksinitiative angenommen" )))) %>%
mutate(anr = as.factor(anr))
#Neue Variablen generieren & Datensatz selektieren
data$bet_volkja.proz <- (data$bet*(data$volkja.proz/100))
df <- data %>%
select(anr,Jahr, Kurztitel, rechtsform, annahme, bet_volkja.proz, bet, d1e1:br.pos, bv.pos:nr.pos, sr.pos, unter_g, unter_u, ends_with(parteien), ja.lager, nein.lager, volk:stand, volkja.proz, ktjaproz,matches("...bet"),matches("...japroz"), matches("...annahme"),swissvoteslink, anneepolitique, info_br.de, info_dep.de, info_amt.de)
#neue Variablen: prüfen, ob Thema vorkommt und wenn ja, trägt es 1 ein (sonst 0)
df$Sicherheitspolitik <- +(rowSums(df[2:12] == 'Sicherheitspolitik', na.rm = TRUE) > 0)
df$Aussenpolitik <- +(rowSums(df[2:12] == 'Aussenpolitik', na.rm = TRUE) > 0)
df$Ausländer <- +(rowSums(df[2:12] == 'Ausländerpolitik', na.rm = TRUE) > 0)
df$Flüchtlinge <- +(rowSums(df[2:12] == 'Flüchtlinge', na.rm = TRUE) > 0)
#neue Spalte: fasst Themen der neuen Spalten zusammen, alles andere wird als "anderes" kategorisiert.
df <- df %>%
mutate(Thema = factor(case_when(
Sicherheitspolitik == 1 ~ "Sicherheitspolitik",
Aussenpolitik == 1 ~ "Aussenpolitik",
Flüchtlinge == 1 ~ "Flüchtlinge",
Ausländer == 1 ~ "Ausländer",
TRUE ~"andere"))) %>%
mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
mutate(relevant = ifelse(Thema == "andere", "nein", "ja"))
ausländer <- df %>%
filter(Thema %in% c("Ausländer", "Flüchtlinge")) %>%
filter(rechtsform != "Stichfrage") %>%
mutate (Faktor = c(0, 0, 0, 0, 0, 0, 0, -100, -100, 0, 0, 0, -100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -100 )) %>%
mutate(volkja.proz = abs(volkja.proz+Faktor))
#x <- ausländer %>%
# select(ends_with("proz")) %>%
# mutate(lapply(., ~ .+Faktor))
#lapply(x, +ausländer$Faktor)
#x
#Durchschnitt allg. Schweiz bei Abstimmungen vs. Abstimmungen über Ausländer
mean(df$bet, na.rm = TRUE)
mean(ausländer$bet)
kantone_bet <- ausländer %>%
select(ends_with(".bet")) %>%
summarize(mean = colMeans(., na.rm = TRUE))
kantone_japroz <- ausländer %>%
select(ends_with(".japroz"))
Liste_kantone <- list(names(colMeans(ausländer[39:64])))
svp_ja <- ausländer %>%
filter(p.svp == "Befürwortend") %>%
summarize(Durchschnitt = colMeans(ausländer[39:64], na.rm = TRUE))
svp_nein <- ausländer %>%
filter(p.svp == "Ablehnend") %>%
summarise_at(c(names(kantone_japroz)), mean, na.rm = TRUE)
svp_total <- ausländer %>%
group_by(p.svp) %>%
summarise_at(c(names(kantone_japroz)), mean, na.rm = TRUE)
ggplot(svp_total, aes(p.svp, zh.japroz))+
geom_jitter()
SVP_kt <- cbind(argh = Liste_kantone, svp_ja, svp_nein)
colnames(SVP_kt)[1] <- "Kanton"
mean(df$volkja.proz, na.rm = TRUE)
annahmen_ausländer <- ausländer %>%
group_by(rechtsform) %>%
summarize(mean = mean(volkja.proz, na.rm = TRUE))
mean(ausländer$volkja.proz)
parteien_japroz <- ausländer %>%
group_by(p.svp, p.fdp, p.sps, p.cvp) %>%
summarize(jastimmen = mean(volkja.proz))
ggplot(ausländer, aes(Jahr)) +
geom_histogram(binwidth = 5)
ausländer[39:61]
#colMeans(ausländer["zh.bet":"ge.bet"], na.rm = TRUE)
ggplot(ausländer, aes(Jahrzehnt, fill = Thema)) +
geom_bar()
flüchtling <- df %>%
filter(Thema == "Flüchtlinge")
#Stimmbeteiligung Kantone im Vergleich für Abstimmungen
ggplot(ausländer, aes(anr, bet, fill= annahme))+
geom_col()
#glimpse(df)
#eingeschränkter Datensatz für Visualisierung
df_vis <- df %>%
select(anr, Jahr, Kurztitel, rechtsform, br.pos, Sicherheitspolitik:relevant)
#Anzahl Abstimmungen, gruppiert nach Jahrzehnt & Thema, nebeneinander
df_vis %>%
group_by(Jahrzehnt, Thema) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = Thema)) +
geom_bar(position="dodge", stat="identity") +
scale_fill_brewer(palette="Spectral")

#Anzahl Abstimmungen, gruppiert nach Jahrzehnt & Thema, stacked
df_vis %>%
group_by(Jahrzehnt, relevant, Thema) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = Thema)) +
geom_bar(position="stack", stat="identity") +
scale_fill_brewer(palette="Spectral") +
labs(title = "Anzahl Abstimmungen pro Jahrzehnt", subtitle = "Gruppiert nach Themen unseres Beitrages & Rest", y = "Anzahl")

df_vis %>%
filter(Thema == "Ausländer"|Thema == "Flüchtlinge") %>%
group_by(Jahrzehnt, relevant, Thema) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = Thema)) +
geom_bar(position="dodge", stat="identity") +
scale_fill_brewer(palette="Spectral") +
labs(title = "Anzahl Abstimmungen pro Jahrzehnt", subtitle = "Gruppiert nach Themen unseres Beitrages & Rest", y = "Anzahl")

df %>%
filter(Thema == "Ausländer"|Thema == "Flüchtlinge") %>%
group_by(Jahrzehnt, Thema, annahme) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = annahme)) +
geom_bar(position="stack", stat="identity") +
#scale_fill_brewer(palette="Spectral") +
labs(title = "Anzahl Abstimmungen zu Flüchtlinge / Ausländer", subtitle = "Angenommene & abgelehnte", y = "Anzahl")

#Abstimmungen, gruppiert nach Rechtsform & Jahrzehnt
df %>%
filter(relevant == "ja") %>%
group_by(Jahrzehnt, rechtsform, Thema,annahme) %>%
count() %>%
ggplot(aes(Jahrzehnt, rechtsform, color = annahme)) +
geom_jitter() +
#scale_color_brewer(palette="Spectral") +
facet_wrap(~Thema)

#Anzahl Abstimmungen pro Jahrzehnt in Zahlen (nur relevante Themen)
df %>%
filter(Jahr > 1910, relevant == "ja") %>%
group_by(Jahrzehnt, Thema) %>%
count()
#Anzahl Abstimmungen pro Rechtsform + Position Bundesrat in Zahlen (nur relevante Themen)
df_vis %>%
filter(Jahr > 1910, relevant == "ja") %>%
group_by(rechtsform, Thema, br.pos) %>%
count()
ausländer <- df %>%
filter(Thema == "Ausländer")
flucht <- df %>%
filter(Thema == "Flüchtlinge")
positionen_br <- ggplot(df, aes( Jahr,rechtsform, color = br.pos )) + geom_jitter() + scale_color_brewer(palette="Spectral")
positionen_br

ggplot(df, aes(Jahr, br.pos, color = Thema, shape = rechtsform)) +
geom_jitter(alpha = 0.7) +
scale_color_brewer(palette="Spectral")

#scale_y_discrete(breaks = seq(1820, 2022, 10))
df %>%
filter(relevant == "ja") %>%
ggplot(aes(br.pos, Thema, color = rechtsform), na.rm = TRUE) +
geom_jitter(alpha = 0.7) +
scale_color_brewer(palette="Spectral")

#scale_y_discrete(breaks = seq(1820, 2022, 10))
df %>%
filter(relevant == "ja") %>%
ggplot(aes(Thema, rechtsform, color = br.pos)) +
geom_jitter()

#scale_color_brewer(palette="Spectral")
#scale_y_discrete(breaks = seq(1820, 2022, 10))
df %>%
filter(relevant == "ja") %>%
ggplot(aes(Jahr, br.pos, shape = Thema, color = rechtsform)) +
geom_jitter(alpha = 0.7) +
scale_color_brewer(palette="Spectral")

#scale_y_discrete(breaks = seq(1820, 2022, 10))
ggplot(df, aes(Jahr, volk, color = Thema, size = volkja.proz)) +
geom_jitter() +
scale_color_brewer(palette="Spectral")

df %>%
filter(relevant == 1) %>%
ggplot(aes(Jahr, volk, color = Thema, size = volkja.proz)) +
geom_jitter() +
scale_color_brewer(palette="Spectral")

df_vis %>%
group_by(Jahr, relevant, Thema) %>%
count() %>%
ggplot(aes(Jahr, n, fill = Thema)) +
geom_bar(position="stack", stat="identity") +
scale_fill_brewer(palette="Spectral")

df_vis %>%
group_by(Jahrzehnt, Jahr, relevant, Thema) %>%
count() %>%
ggplot(aes(Jahr, n, color = Thema)) +
geom_point() +
facet_wrap(~Jahrzehnt)

df_vis %>%
group_by(Jahrzehnt, relevant, Thema) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = relevant)) +
geom_bar(position="dodge", stat="identity")

ggplot(df_vis, aes(Jahr, Thema))+
geom_col()

ggplot(df, aes(Jahr)) +
geom_histogram()

df %>%
mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
group_by(Jahrzehnt, d1e1) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = d1e1)) +
geom_bar(position="dodge", stat="identity") +
scale_fill_brewer(palette="Spectral")

df %>%
select(Jahrzehnt, relevant) %>%
group_by(Jahrzehnt, relevant) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, color = relevant)) +
geom_bar(position="dodge", stat="identity") +
scale_fill_brewer(palette="Spectral")

df %>%
select(Jahrzehnt, titel_kurz_d) %>%
group_by(Jahrzehnt) %>%
count() %>%
ggplot(aes(Jahrzehnt, n)) +
geom_bar(position="dodge", stat="identity") +
scale_fill_brewer(palette="Spectral")
Error in `select()`:
! Can't subset columns past the end.
x Column `titel_kurz_d` doesn't exist.
Backtrace:
1. ... %>% ggplot(aes(Jahrzehnt, n))
6. dplyr:::select.data.frame(., Jahrzehnt, titel_kurz_d)
9. tidyselect::eval_select(expr(c(...)), .data)
10. tidyselect:::eval_select_impl(...)
19. tidyselect:::vars_select_eval(...)
...
22. tidyselect:::reduce_sels(node, data_mask, context_mask, init = init)
23. tidyselect:::walk_data_tree(new, data_mask, context_mask)
24. tidyselect:::as_indices_sel_impl(...)
25. tidyselect:::as_indices_impl(x, vars, call = call, strict = strict)
26. tidyselect:::chr_as_locations(x, vars, call = call)
df %>% mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
select(Jahr, Jahrzehnt, Sicherheitspolitik, Aussenpolitik, Ausländer) %>%
group_by(Jahr) %>%
ggplot(aes(Jahr)) +
geom_histogram()

NA
NA
NA
df %>%
mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
filter(d1e1|d2e1|d3e1 %in% c("Aussenpolitik", "Sicherheitspolitik", "Sozialpolitik")) %>%
group_by(Jahrzehnt, d1e1, d2e1) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = d1e1)) +
geom_col(position="dodge", stat="identity") +
scale_fill_brewer(palette="Spectral")
‘|’ not meaningful for factorsIgnoring unknown parameters: stat

df %>%
mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
filter(d1e1 %in% c("Aussenpolitik", "Sicherheitspolitik", "Sozialpolitik")) %>%
group_by(Jahrzehnt, d1e1, d2e1) %>%
count() %>%
ggplot(aes(Jahrzehnt, n, fill = d1e1)) +
geom_col(position="dodge", stat="identity") +
scale_fill_brewer(palette="Spectral")
Ignoring unknown parameters: stat

df %>%
mutate(Jahrzehnt = as.factor(floor(Jahr/10)*10)) %>%
filter(d1e1|d2e1|d3e1 %in% c("Aussenpolitik", "Sicherheitspolitik", "Sozialpolitik")) %>%
group_by(d1e1, Jahr) %>%
count()
‘|’ not meaningful for factors
# Alter code-chunk
# df_neu <- df_clean %>%
# filter(d1e3|d2e3|d3e3 %in% themen) %>%
# select_if(~sum(!is.na(.)) > 0) %>% #nur Spalten wählen, die nicht zu 100% NAs sind
# rowwise() %>%
# mutate(alle_kat = list(c(d1e3, d2e3, d3e3))) %>%
# mutate(alle_kat = list(alle_kat[!is.na(alle_kat)]))
thema_volk <- inner_join(aus_anr, volkja_proz_tab)
Joining, by = "anr"
korrektur <- c(0,0,0,0,0,0,0,100,100,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,100)
kantone_japroz_korr <- data.frame(kantone_japroz)
kantone_japroz_korr <- bind_cols(kantone_japroz_korr, thema_volk)
for (i in 1:length(kantone_japroz_korr)) {
kantone_japroz_korr[,i] <- abs(kantone_japroz_korr[,i] -korrektur)
}
kantone_japroz_korr$ju.japroz <- NULL
kantone_japroz_mean <- data.frame(colMeans(kantone_japroz_korr))
kantone_japroz_mean <- kantone_japroz_mean %>%
mutate(contra_verschärfung = 100- kantone_japroz_mean$colMeans.kantone_japroz_korr.)
kantone_japroz_mean <- kantone_japroz_mean %>%
rename(pro_verschärfung = colMeans.kantone_japroz_korr.)
kantone_japroz_mean["Kantone"] <- rownames(kantone_japroz_mean)
kantone_japroz_mean <- kantone_japroz_mean %>%
pivot_longer(
cols = pro_verschärfung:contra_verschärfung,
names_to = "Position",
values_to = "Prozent"
)
verschärfung <- ggplot(kantone_japroz_mean, aes(x=reorder(Kantone, Prozent), y=Prozent, fill=Position))+
geom_bar(position="stack", stat = "identity")+
theme(axis.text.x = element_text(angle = 90))
ggplotly(verschärfung)
test <- ausländer %>%
select(Kurztitel, zhja.proz)
Error in `select()`:
! Can't subset columns past the end.
x Column `zhja.proz` doesn't exist.
Backtrace:
1. ausländer %>% select(Kurztitel, zhja.proz)
3. dplyr:::select.data.frame(., Kurztitel, zhja.proz)
6. tidyselect::eval_select(expr(c(...)), .data)
7. tidyselect:::eval_select_impl(...)
16. tidyselect:::vars_select_eval(...)
...
19. tidyselect:::reduce_sels(node, data_mask, context_mask, init = init)
20. tidyselect:::walk_data_tree(new, data_mask, context_mask)
21. tidyselect:::as_indices_sel_impl(...)
22. tidyselect:::as_indices_impl(x, vars, call = call, strict = strict)
23. tidyselect:::chr_as_locations(x, vars, call = call)
xlsxFile <- "https://www.sem.admin.ch/dam/sem/de/data/publiservice/statistik/asylstatistik/uebersichten/gesuche-nation-ab-1986-d.xlsx.download.xlsx/gesuche-nation-ab-1986-d.xlsx"
as_nation <- read.xlsx(xlsxFile)
as_nation[1,1] <- "Country"
as_nation[1,38] <- "2022"
as.character(as_nation[1, ])
[1] "Country" "1986" "1987" "1988" "1989" "1990" "1991" "1992" "1993" "1994" "1995" "1996" "1997" "1998" "1999" "2000"
[17] "2001" "2002" "2003" "2004" "2005" "2006" "2007" "2008" "2009" "2010" "2011" "2012" "2013" "2014" "2015" "2016"
[33] "2017" "2018" "2019" "2020" "2021" "2022"
names(as_nation) <- as_nation[1,]
as_nation <- as_nation[-1,]
total <- as_nation[186,]
as_nation <- as_nation[-186,]
cum_nat <- as_nation %>%
pivot_longer(
cols = "1986":"2022",
names_to = "Jahr",
values_to = "Anzahl"
)
cum_nat <- transform(cum_nat, Anzahl = as.numeric(Anzahl))
top_land <- aggregate(cum_nat$Anzahl, by=list(Land=cum_nat$Country), FUN=sum)
top_land <- top_land %>%
arrange(desc(x)) %>%
ungroup()
laender <- as_nation[,1]
top_20 <- top_land %>%
mutate(Land=ifelse(Land %in% head(Land, 20),
Land, "Andere"))
top_20 <- aggregate(top_20$x, by=list(Herkunftsland=top_20$Land), FUN=sum)
LS0tCnRpdGxlOiAiQ0RBMiBDaGFsbGVuZ2UiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQoKI0xpYnJhcnlzIGluc3RhbGxpZXJlbgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShuZXR3b3JrRDMpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KGVzcXVpc3NlKQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQpsaWJyYXJ5KG9wZW54bHN4KQpgYGAKCgpgYGB7cn0KI0RhdGVuc2F0eiBlaW5sZXNlbgpkZl9vcmlnaW5hbCA8LSByZWFkLmNzdigiaHR0cHM6Ly9zd2lzc3ZvdGVzLmNoL3BhZ2UvZGF0YXNldC9zd2lzc3ZvdGVzX2RhdGFzZXQuY3N2IiwgaGVhZGVyPVRSVUUsIHNlcD0iOyIsIG5hID0gYygiTkEiLCAiLiIpKQpgYGAKCgoKYGBge3J9CiNEYXRlbnNhdHogYW5zY2hhdWVuCmhlYWQoZGZfb3JpZ2luYWwpCnN0cihkZl9vcmlnaW5hbCkKCmBgYAoKCgpgYGB7cn0KI1ZhcmlhYmxlbiBkZWZpbmllcmVuIHVtIG5hY2hoZXIgbWVocmVyZSBTcGFsdGVuIGdsZWljaHplaXRpZyB6dSBtdXRpZXJlbgoKcG9zaXRpb25lbiAgPC0gZGZfb3JpZ2luYWwgJT4lCiAgc2VsZWN0KGVuZHNfd2l0aCgiLnBvcyIpfHN0YXJ0c193aXRoKCJwLiIpfHN0YXJ0c193aXRoKCJwZGV2IikpIAoKaGF1cHR0aGVtYSA8LSBkZl9vcmlnaW5hbCAlPiUKICBzZWxlY3QoZDFlMSwgZDJlMSAsZDNlMSkKCnVudGVydGhlbWEgPC0gZGZfb3JpZ2luYWwgJT4lCiAgc2VsZWN0KGQxZTIsIGQyZTIgLGQzZTIpCgp1bnRlcnVudGVydGhlbWEgPC0gZGZfb3JpZ2luYWwgJT4lCiAgc2VsZWN0KGQxZTMsIGQyZTMgLGQzZTMpCgpkYXRlbiA8LSBkZl9vcmlnaW5hbCU+JQogIHNlbGVjdChkYXR1bSwgc3RhcnRzX3dpdGgoImRhdC4iKSkKCnJlc3VsdGF0ZSA8LSBkZl9vcmlnaW5hbCAlPiUKICBzZWxlY3QoZW5kc193aXRoKCJhbm5haG1lIil8IHZvbGsgfCBzdGFuZCkKCnBhcnRlaWVuIDwtIGMoIi5zdnAiLCAiLmZkcCIsICIuc3AiLCAiLmN2cCIsICIuZ3NwIiwgIi5zcHMiKQoKYGBgCgoKYGBge3J9CiNEYXRhLVdyYW5nbGluZyAoVmFyaWFibGVuIGNvZGllcmVuKQpkYXRhIDwtIGRmX29yaWdpbmFsICU+JQogICMgZmlsdGVyKChkMWUyID4gMiAmIGQxZTIgPCA0IHwgKGQxZTMgPiAxMC4zMCAmIGQxZTMgPCAxMC4zMykpIHwKICAjICAgICAgICAoZDJlMiA+IDIgJiBkMmUyIDwgNCB8IChkMmUzID4gMTAuMzAgJiBkMmUzIDwgMTAuMzMpKXwKICAjICAgICAgICAoZDNlMiA+IDIgJiBkM2UyIDwgNCB8IChkM2UzID4gMTAuMzAgJiBkM2UzIDwgMTAuMzMpKSApICU+JSAjRmlsdGVyIGRlciBUaGVtZW5nZWJpZXRlCiAgc2VsZWN0KC0oZW5kc193aXRoKCIuZnIiKXxlbmRzX3dpdGgoIl9mIil8ZW5kc193aXRoKCIuZW4iKSkpJT4lICNFbnRmZXJudW5nIGZyYW56w7ZzaXNjaGUgw5xiZXJzZXR6dW5nZW4KICByZW5hbWUoS3VyenRpdGVsID0gdGl0ZWxfa3Vyel9kLCBUaXRlbCA9IHRpdGVsX29mZl9kLCApICU+JSAKCiAgICBtdXRhdGUocmVjaHRzZm9ybSA9IGZhY3RvcihjYXNlX3doZW4oCiAgICByZWNodHNmb3JtID09IDEgfiAiT2JsaWdhdG9yaXNjaGVzIFJlZmVyZW5kdW0iLAogICAgcmVjaHRzZm9ybSA9PSAyIH4gIkZha3VsdGF0aXZlcyBSZWZlcmVuZHVtIiwKICAgIHJlY2h0c2Zvcm0gPT0gMyB+ICJWb2xrc2luaXRpYXRpdmUiLAogICAgcmVjaHRzZm9ybSA9PSA0IH4gIkdlZ2VuZW50d3VyZiB6dSBWb2xrc2luaXRpYXRpdmUiLAogICAgcmVjaHRzZm9ybSA9PSA1IH4gIlN0aWNoZnJhZ2UiKSkpJT4lIAogIAogICAgbXV0YXRlKGRlcCA9IGZhY3RvcihjYXNlX3doZW4oCiAgICBkZXAgPT0gMSB+ICJFREEiLAogICAgZGVwID09IDIgfiAiRURJIiwKICAgIGRlcCA9PSAzIH4gIkVKUEQiLAogICAgZGVwID09IDQgfiAiVkJTIiwKICAgIGRlcCA9PSA1IH4gIkVGRCIsCiAgICBkZXAgPT0gNiB+ICJXQkYiLAogICAgZGVwID09IDcgfiAiVVZFSyIsCiAgICBkZXAgPT0gOCB+ICJCSyIpKSklPiUKICBtdXRhdGUgKEphaHIgPSBhcy5pbnRlZ2VyKGZvcm1hdChhcy5EYXRlKGRhdHVtLCBmb3JtYXQ9JyVkLiVtLiVZJyksIGZvcm1hdD0iJVkiKSkpICU+JSAKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKHBvc2l0aW9uZW4pLCAKICAgICAgICAgICB+IGZhY3RvcihjYXNlX3doZW4oLiA9PSAxIH4gIkJlZsO8cndvcnRlbmQiLAogICAgLj09IDIgfiJBYmxlaG5lbmQiLAogICAgLj09IDMgfiJLZWluZSIsCiAgICAuPT0gNCB+IkxlZXJlIEFiZ2FiZSIsCiAgICAuPT0gNSB+IlN0aW1tZnJlaWdhYmUiLAogICAgLj09IDggfiJWb3J6dWcgZsO8ciBkZW4gR2VnZW5lbnR3dXJmIiwKICAgIC49PSA5IH4iVm9yenVnIGbDvHIgVm9sa3Npbml0aWF0aXZlIiwKICAgIC4gPT0gNjYgfiJrZWluZSIsCiAgICAuID09IDk5OTkgfiJQYXJ0ZWkgZXguIG5pY2h0IiwpKSkpICU+JQogIAogIG11dGF0ZShhY3Jvc3MobmFtZXMoaGF1cHR0aGVtYSksIAogICAgICAgICAgICAgfiBmYWN0b3IoY2FzZV93aGVuKC4gPT0gMSB+ICJTdGFhdHNvcmRudW5nIiwKICAgIC49PSAyIH4gIkF1c3NlbnBvbGl0aWsiLAogICAgLj09IDMgfiJTaWNoZXJoZWl0c3BvbGl0aWsiLAogICAgLj09IDQgfiJXaXJ0c2NoYWZ0IiwKICAgIC49PSA1IH4iTGFuZHdpcnRzY2hhZnQiLAogICAgLj09IDYgfiLDlmZmZW50bGljaGUgRmluYW56ZW4iLAogICAgLj09IDcgfiJFbmVyZ2llIiwKICAgIC49PSA4IH4iVmVya2VociB1bmQgSW5mcmFzdHJ1a3R1ciIsCiAgICAuPT0gOSB+IlVtd2VsdCB1bmQgTGViZW5zcmF1bSIsCiAgICAuPT0gMTAgfiJTb3ppYWxwb2xpdGlrIiwKICAgIC49PSAxMSB+IkJpbGR1bmcgdW5kIEZvcnNjaHVuZyIsCiAgICAuPT0gMTIgfiJLdWx0dXIsIFJlbGlnaW9uLCBNZWRpZW4iLCkpKSklPiUKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKHVudGVydGhlbWEpLCAKICAgICAgICAgICAgIH4gZmFjdG9yKGNhc2Vfd2hlbiguID09IDIuMSB+ICJBdXNzZW5wb2xpdGlzY2hlIEdydW5kaGFsdHVuZyIsCiAgICAuPT0gMi4yIH4gIkV1cm9wYXBvbGl0aWsiLAogICAgLj09IDIuMyB+ICJJbnRlcm5hdGlvbmFsZSBPcmdhbmlzYXRpb25lbiIsCiAgICAuPT0gMi40IH4gIkVudHdpY2tsdW5nc3p1c2FtbWVuYXJiZWl0IiwKICAgIC49PSAyLjUgfiAiU3RhYXRzdmVydHLDpGdlIG1pdCBlaW56ZWxuZW4gU3RhYXRlbiIsCiAgICAuPT0gMi42IH4iQXVzc2Vud2lydHNjaGFmdHNwb2xpdGlrIiwKICAgIC49PSAyLjcgfiJEaXBsb21hdGllIiwKICAgIC49PSAyLjggfiJBdXNsYW5kc2Nod2VpemVyOmlubmVuIiwKICAgIC49PSAzLjEgfiLDlmZmZW50bGljaGUgU2ljaGVyaGVpdCIsCiAgICAuPT0gMy4yIH4iQXJtZWUiLAogICAgLj09IDMuMyB+IkxhbmRlc3ZlcnNvcmd1bmciLAogICAgLj09IDEwLjMgfiJBdXNsw6RuZGVyICYgRmzDvGNodGxpbmdlIiwgCiAgICBUUlVFIH4iYW5kZXJlIikpKSkgJT4lCiAgbXV0YXRlKGFjcm9zcyhuYW1lcyh1bnRlcnVudGVydGhlbWEpLCAKICAgICAgICAgICAgIH4gZmFjdG9yKGNhc2Vfd2hlbiguID09IDEwLjMxIH4gIkF1c2zDpG5kZXJwb2xpdGlrIiwKICAgIC49PSAxMC4zMiB+ICJGbMO8Y2h0bGluZ2UiLAogICAgIFRSVUUgfiJhbmRlcmUiKSkpKSAlPiUKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKGRhdGVuKSwgCiAgICAgICAgICAgICAgICB+IGFzLkRhdGUoLiwgIiVkLiVtLiVZIikpKSAlPiUKICAKICBtdXRhdGUoYWNyb3NzKG5hbWVzKHJlc3VsdGF0ZSksIAogICAgICAgICAgICAgICAgfiBmYWN0b3IoY2FzZV93aGVuKC4gPT0gMCB+ImFiZ2VsZWhudCIsIAogICAgICAgICAgICAgICAgLj09IDEgfiAiYW5nZW5vbW1lbiIsIAogICAgICAgICAgICAgICAgLj09IDMgfiAiU3TDpG5kZW1laHIgbmljaHQgbsO2dGlnIiwgCiAgICAgICAgICAgICAgICAuPT0gOCB+ICJHZWdlbmVudHd1cmYgYW5nZW5vbW1lbiIsIAogICAgICAgICAgICAgICAgLj09IDkgfiAiVm9sa3Npbml0aWF0aXZlIGFuZ2Vub21tZW4iICkpKSkgJT4lIAogIG11dGF0ZShhbnIgPSBhcy5mYWN0b3IoYW5yKSkgCiAgCgogIApgYGAKCgpgYGB7cn0gCiNOZXVlIFZhcmlhYmxlbiBnZW5lcmllcmVuICYgRGF0ZW5zYXR6IHNlbGVrdGllcmVuCgpkYXRhJGJldF92b2xramEucHJveiA8LSAoZGF0YSRiZXQqKGRhdGEkdm9sa2phLnByb3ovMTAwKSkKCmRmIDwtIGRhdGEgJT4lCiAgc2VsZWN0KGFucixKYWhyLCBLdXJ6dGl0ZWwsIHJlY2h0c2Zvcm0sIGFubmFobWUsIGJldF92b2xramEucHJveiwgYmV0LCAgZDFlMTpici5wb3MsIGJ2LnBvczpuci5wb3MsIHNyLnBvcywgdW50ZXJfZywgdW50ZXJfdSwgZW5kc193aXRoKHBhcnRlaWVuKSwgamEubGFnZXIsIG5laW4ubGFnZXIsIHZvbGs6c3RhbmQsIHZvbGtqYS5wcm96LCBrdGphcHJveixtYXRjaGVzKCIuLi5iZXQiKSxtYXRjaGVzKCIuLi5qYXByb3oiKSwgbWF0Y2hlcygiLi4uYW5uYWhtZSIpLHN3aXNzdm90ZXNsaW5rLCBhbm5lZXBvbGl0aXF1ZSwgaW5mb19ici5kZSwgaW5mb19kZXAuZGUsIGluZm9fYW10LmRlKQoKCiNuZXVlIFZhcmlhYmxlbjogcHLDvGZlbiwgb2IgVGhlbWEgdm9ya29tbXQgdW5kIHdlbm4gamEsIHRyw6RndCBlcyAxIGVpbiAoc29uc3QgMCkKZGYkU2ljaGVyaGVpdHNwb2xpdGlrIDwtICsocm93U3VtcyhkZlsyOjEyXSA9PSAnU2ljaGVyaGVpdHNwb2xpdGlrJywgbmEucm0gPSBUUlVFKSA+IDApCmRmJEF1c3NlbnBvbGl0aWsgPC0gKyhyb3dTdW1zKGRmWzI6MTJdID09ICdBdXNzZW5wb2xpdGlrJywgbmEucm0gPSBUUlVFKSA+IDApCmRmJEF1c2zDpG5kZXIgPC0gKyhyb3dTdW1zKGRmWzI6MTJdID09ICdBdXNsw6RuZGVycG9saXRpaycsIG5hLnJtID0gVFJVRSkgPiAwKQpkZiRGbMO8Y2h0bGluZ2UgPC0gKyhyb3dTdW1zKGRmWzI6MTJdID09ICdGbMO8Y2h0bGluZ2UnLCBuYS5ybSA9IFRSVUUpID4gMCkKCiNuZXVlIFNwYWx0ZTogZmFzc3QgVGhlbWVuIGRlciBuZXVlbiBTcGFsdGVuIHp1c2FtbWVuLCBhbGxlcyBhbmRlcmUgd2lyZCBhbHMgImFuZGVyZXMiIGthdGVnb3Jpc2llcnQuIApkZiA8LSBkZiAlPiUgCiAgICBtdXRhdGUoVGhlbWEgPSBmYWN0b3IoY2FzZV93aGVuKAogICAgU2ljaGVyaGVpdHNwb2xpdGlrID09IDEgfiAiU2ljaGVyaGVpdHNwb2xpdGlrIiwKICAgIEF1c3NlbnBvbGl0aWsgPT0gMSB+ICJBdXNzZW5wb2xpdGlrIiwKICAgIEZsw7xjaHRsaW5nZSA9PSAxIH4gIkZsw7xjaHRsaW5nZSIsCiAgICBBdXNsw6RuZGVyID09IDEgfiAiQXVzbMOkbmRlciIsCiAgICBUUlVFIH4iYW5kZXJlIikpKSAlPiUgCiAgICBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lIAogICAgbXV0YXRlKHJlbGV2YW50ID0gaWZlbHNlKFRoZW1hID09ICJhbmRlcmUiLCAibmVpbiIsICJqYSIpKSAKCmBgYAoKCmBgYHtyfSAKYXVzbMOkbmRlciA8LSBkZiAlPiUgCiAgZmlsdGVyKFRoZW1hICVpbiUgYygiQXVzbMOkbmRlciIsICJGbMO8Y2h0bGluZ2UiKSkgJT4lCiAgZmlsdGVyKHJlY2h0c2Zvcm0gIT0gIlN0aWNoZnJhZ2UiKSAlPiUgCiAgbXV0YXRlIChGYWt0b3IgPSBjKDAsIDAsIDAsIDAsIDAsIDAsIDAsIC0xMDAsIC0xMDAsIDAsIDAsIDAsIC0xMDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAtMTAwICkpICU+JSAKICBtdXRhdGUodm9sa2phLnByb3ogPSBhYnModm9sa2phLnByb3orRmFrdG9yKSkKCgojeCA8LSBhdXNsw6RuZGVyICU+JSAKIyAgc2VsZWN0KGVuZHNfd2l0aCgicHJveiIpKSAlPiUgCiAjIG11dGF0ZShsYXBwbHkoLiwgfiAuK0Zha3RvcikpCiAgCiNsYXBwbHkoeCwgK2F1c2zDpG5kZXIkRmFrdG9yKQojeAoKI0R1cmNoc2Nobml0dCBhbGxnLiBTY2h3ZWl6IGJlaSBBYnN0aW1tdW5nZW4gdnMuIEFic3RpbW11bmdlbiDDvGJlciBBdXNsw6RuZGVyCm1lYW4oZGYkYmV0LCBuYS5ybSA9IFRSVUUpCm1lYW4oYXVzbMOkbmRlciRiZXQpCgoKCgoKa2FudG9uZV9iZXQgPC0gYXVzbMOkbmRlciAlPiUKICBzZWxlY3QoZW5kc193aXRoKCIuYmV0IikpICU+JSAKICBzdW1tYXJpemUobWVhbiA9IGNvbE1lYW5zKC4sIG5hLnJtID0gVFJVRSkpCgprYW50b25lX2phcHJveiA8LSBhdXNsw6RuZGVyICU+JSAKICBzZWxlY3QoZW5kc193aXRoKCIuamFwcm96IikpCgpMaXN0ZV9rYW50b25lIDwtIGxpc3QobmFtZXMoY29sTWVhbnMoYXVzbMOkbmRlclszOTo2NF0pKSkKYGBgCgoKYGBge3J9IApzdnBfamEgPC0gYXVzbMOkbmRlciAlPiUgCiAgZmlsdGVyKHAuc3ZwID09ICJCZWbDvHJ3b3J0ZW5kIikgJT4lIAogIHN1bW1hcml6ZShEdXJjaHNjaG5pdHQgPSBjb2xNZWFucyhhdXNsw6RuZGVyWzM5OjY0XSwgbmEucm0gPSBUUlVFKSkKCgoKc3ZwX25laW4gPC0gYXVzbMOkbmRlciAlPiUgCiAgZmlsdGVyKHAuc3ZwID09ICJBYmxlaG5lbmQiKSAlPiUgCiAgc3VtbWFyaXNlX2F0KGMobmFtZXMoa2FudG9uZV9qYXByb3opKSwgbWVhbiwgbmEucm0gPSBUUlVFKQoKCnN2cF90b3RhbCA8LSBhdXNsw6RuZGVyICU+JSAKICBncm91cF9ieShwLnN2cCkgJT4lIAogIHN1bW1hcmlzZV9hdChjKG5hbWVzKGthbnRvbmVfamFwcm96KSksIG1lYW4sIG5hLnJtID0gVFJVRSkKCgpnZ3Bsb3Qoc3ZwX3RvdGFsLCBhZXMocC5zdnAsIHpoLmphcHJveikpKwogIGdlb21faml0dGVyKCkKClNWUF9rdCA8LSBjYmluZChhcmdoID0gTGlzdGVfa2FudG9uZSwgc3ZwX2phLCBzdnBfbmVpbikgCgpjb2xuYW1lcyhTVlBfa3QpWzFdIDwtICJLYW50b24iCgoKbWVhbihkZiR2b2xramEucHJveiwgbmEucm0gPSBUUlVFKQoKYW5uYWhtZW5fYXVzbMOkbmRlciA8LSBhdXNsw6RuZGVyICU+JSAKICBncm91cF9ieShyZWNodHNmb3JtKSAlPiUgCiAgc3VtbWFyaXplKG1lYW4gPSBtZWFuKHZvbGtqYS5wcm96LCBuYS5ybSA9IFRSVUUpKQptZWFuKGF1c2zDpG5kZXIkdm9sa2phLnByb3opCgoKcGFydGVpZW5famFwcm96IDwtIGF1c2zDpG5kZXIgJT4lIAogIGdyb3VwX2J5KHAuc3ZwLCBwLmZkcCwgcC5zcHMsIHAuY3ZwKSAlPiUgCiAgc3VtbWFyaXplKGphc3RpbW1lbiA9IG1lYW4odm9sa2phLnByb3opKQogIApnZ3Bsb3QoYXVzbMOkbmRlciwgYWVzKEphaHIpKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNSkKCgoKCmF1c2zDpG5kZXJbMzk6NjFdCgoKI2NvbE1lYW5zKGF1c2zDpG5kZXJbInpoLmJldCI6ImdlLmJldCJdLCBuYS5ybSA9IFRSVUUpCmdncGxvdChhdXNsw6RuZGVyLCBhZXMoSmFocnplaG50LCBmaWxsID0gVGhlbWEpKSArIAogIGdlb21fYmFyKCkKCmZsw7xjaHRsaW5nIDwtIGRmICU+JSAKICBmaWx0ZXIoVGhlbWEgPT0gIkZsw7xjaHRsaW5nZSIpIAoKCiNTdGltbWJldGVpbGlndW5nIEthbnRvbmUgaW0gVmVyZ2xlaWNoIGbDvHIgQWJzdGltbXVuZ2VuCmdncGxvdChhdXNsw6RuZGVyLCBhZXMoYW5yLCBiZXQsIGZpbGw9IGFubmFobWUpKSsKICBnZW9tX2NvbCgpCgojZ2xpbXBzZShkZikKYGBgCgoKCmBgYHtyfSAKI2Vpbmdlc2NocsOkbmt0ZXIgRGF0ZW5zYXR6IGbDvHIgVmlzdWFsaXNpZXJ1bmcKZGZfdmlzIDwtIGRmICU+JSAKICBzZWxlY3QoYW5yLCBKYWhyLCBLdXJ6dGl0ZWwsIHJlY2h0c2Zvcm0sIGJyLnBvcywgU2ljaGVyaGVpdHNwb2xpdGlrOnJlbGV2YW50KSAKCmBgYAoKCmBgYHtyfSAKI0FuemFobCBBYnN0aW1tdW5nZW4sIGdydXBwaWVydCBuYWNoIEphaHJ6ZWhudCAmIFRoZW1hLCBuZWJlbmVpbmFuZGVyCmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBUaGVtYSkgJT4lIAogIGNvdW50KCkgJT4lIAogIGdncGxvdChhZXMoSmFocnplaG50LCBuLCBmaWxsID0gVGhlbWEpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKQoKI0FuemFobCBBYnN0aW1tdW5nZW4sIGdydXBwaWVydCBuYWNoIEphaHJ6ZWhudCAmIFRoZW1hLCBzdGFja2VkCmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCByZWxldmFudCwgVGhlbWEpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgbiwgZmlsbCA9IFRoZW1hKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgKwogIGxhYnModGl0bGUgPSAiQW56YWhsIEFic3RpbW11bmdlbiBwcm8gSmFocnplaG50Iiwgc3VidGl0bGUgPSAgIkdydXBwaWVydCBuYWNoIFRoZW1lbiB1bnNlcmVzIEJlaXRyYWdlcyAmIFJlc3QiLCB5ID0gIkFuemFobCIpCgoKCgpkZl92aXMgJT4lIAogIGZpbHRlcihUaGVtYSA9PSAiQXVzbMOkbmRlciJ8VGhlbWEgPT0gIkZsw7xjaHRsaW5nZSIpICU+JSAKICBncm91cF9ieShKYWhyemVobnQsIHJlbGV2YW50LCBUaGVtYSkgJT4lIAogIGNvdW50KCkgJT4lIAogIGdncGxvdChhZXMoSmFocnplaG50LCBuLCBmaWxsID0gVGhlbWEpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249ImRvZGdlIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSArCiAgbGFicyh0aXRsZSA9ICJBbnphaGwgQWJzdGltbXVuZ2VuIHBybyBKYWhyemVobnQiLCBzdWJ0aXRsZSA9ICAiR3J1cHBpZXJ0IG5hY2ggVGhlbWVuIHVuc2VyZXMgQmVpdHJhZ2VzICYgUmVzdCIsIHkgPSAiQW56YWhsIikKCgpkZiAlPiUgCiAgZmlsdGVyKFRoZW1hID09ICJBdXNsw6RuZGVyInxUaGVtYSA9PSAiRmzDvGNodGxpbmdlIikgJT4lIAogIGdyb3VwX2J5KEphaHJ6ZWhudCwgVGhlbWEsIGFubmFobWUpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgbiwgZmlsbCA9IGFubmFobWUpKSArCiAgZ2VvbV9iYXIocG9zaXRpb249InN0YWNrIiwgc3RhdD0iaWRlbnRpdHkiKSArCiAgI3NjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgKwogIGxhYnModGl0bGUgPSAiQW56YWhsIEFic3RpbW11bmdlbiB6dSBGbMO8Y2h0bGluZ2UgLyBBdXNsw6RuZGVyIiwgc3VidGl0bGUgPSAgIkFuZ2Vub21tZW5lICYgYWJnZWxlaG50ZSIsIHkgPSAiQW56YWhsIikKCmBgYAoKCmBgYHtyfSAKI0Fic3RpbW11bmdlbiwgZ3J1cHBpZXJ0IG5hY2ggUmVjaHRzZm9ybSAmIEphaHJ6ZWhudApkZiAlPiUgCiAgZmlsdGVyKHJlbGV2YW50ID09ICJqYSIpICU+JSAKICBncm91cF9ieShKYWhyemVobnQsIHJlY2h0c2Zvcm0sIFRoZW1hLGFubmFobWUpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgcmVjaHRzZm9ybSwgY29sb3IgPSBhbm5haG1lKSkgKwogIGdlb21faml0dGVyKCkgKwogICNzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSArCiAgZmFjZXRfd3JhcCh+VGhlbWEpCgpgYGAKCgpgYGB7cn0gCiNBbnphaGwgQWJzdGltbXVuZ2VuIHBybyBKYWhyemVobnQgaW4gWmFobGVuIChudXIgcmVsZXZhbnRlIFRoZW1lbikKZGYgJT4lIAogIGZpbHRlcihKYWhyID4gMTkxMCwgcmVsZXZhbnQgPT0gImphIikgJT4lIAogIGdyb3VwX2J5KEphaHJ6ZWhudCwgVGhlbWEpICU+JSAKICBjb3VudCgpCgojQW56YWhsIEFic3RpbW11bmdlbiBwcm8gUmVjaHRzZm9ybSArIFBvc2l0aW9uIEJ1bmRlc3JhdCBpbiBaYWhsZW4gKG51ciByZWxldmFudGUgVGhlbWVuKQpkZl92aXMgJT4lIAogIGZpbHRlcihKYWhyID4gMTkxMCwgcmVsZXZhbnQgPT0gImphIikgJT4lIAogIGdyb3VwX2J5KHJlY2h0c2Zvcm0sIFRoZW1hLCBici5wb3MpICU+JSAKICBjb3VudCgpCgoKYXVzbMOkbmRlciA8LSBkZiAlPiUgCiAgZmlsdGVyKFRoZW1hID09ICJBdXNsw6RuZGVyIikKCmZsdWNodCA8LSBkZiAlPiUgCiAgZmlsdGVyKFRoZW1hID09ICJGbMO8Y2h0bGluZ2UiKQoKICAKYGBgCgoKYGBge3J9IAoKcG9zaXRpb25lbl9iciA8LSBnZ3Bsb3QoZGYsIGFlcyggSmFocixyZWNodHNmb3JtLCBjb2xvciA9IGJyLnBvcyApKSArIGdlb21faml0dGVyKCkgKyBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSAKCnBvc2l0aW9uZW5fYnIKCmdncGxvdChkZiwgYWVzKEphaHIsIGJyLnBvcywgY29sb3IgPSBUaGVtYSwgc2hhcGUgPSByZWNodHNmb3JtKSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC43KSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgCiAgI3NjYWxlX3lfZGlzY3JldGUoYnJlYWtzID0gc2VxKDE4MjAsIDIwMjIsIDEwKSkKCiAgZGYgJT4lIAogIGZpbHRlcihyZWxldmFudCA9PSAiamEiKSAlPiUgCiAgZ2dwbG90KGFlcyhici5wb3MsIFRoZW1hLCBjb2xvciA9IHJlY2h0c2Zvcm0pLCBuYS5ybSA9IFRSVUUpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuNykgICArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgCiAgI3NjYWxlX3lfZGlzY3JldGUoYnJlYWtzID0gc2VxKDE4MjAsIDIwMjIsIDEwKSkKICAKICAKICBkZiAlPiUgCiAgZmlsdGVyKHJlbGV2YW50ID09ICJqYSIpICU+JSAKICBnZ3Bsb3QoYWVzKFRoZW1hLCByZWNodHNmb3JtLCBjb2xvciA9IGJyLnBvcykpICsKICBnZW9tX2ppdHRlcigpIAogICNzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSAKICAjc2NhbGVfeV9kaXNjcmV0ZShicmVha3MgPSBzZXEoMTgyMCwgMjAyMiwgMTApKQogIAogIAogIGRmICU+JSAKICBmaWx0ZXIocmVsZXZhbnQgPT0gImphIikgJT4lIAogIGdncGxvdChhZXMoSmFociwgYnIucG9zLCBzaGFwZSA9IFRoZW1hLCBjb2xvciA9IHJlY2h0c2Zvcm0pKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjcpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU3BlY3RyYWwiKSAKICAjc2NhbGVfeV9kaXNjcmV0ZShicmVha3MgPSBzZXEoMTgyMCwgMjAyMiwgMTApKQpgYGAKCgpgYGB7cn0gCmdncGxvdChkZiwgYWVzKEphaHIsIHZvbGssIGNvbG9yID0gVGhlbWEsIHNpemUgPSB2b2xramEucHJveikpICsKICAgIGdlb21faml0dGVyKCkgKwogICAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikgCgoKZGYgJT4lIAogIGZpbHRlcihyZWxldmFudCA9PSAxKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyLCB2b2xrLCBjb2xvciA9IFRoZW1hLCBzaXplID0gdm9sa2phLnByb3opKSArCiAgICBnZW9tX2ppdHRlcigpICsKICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpIAoKYGBgCgoKYGBge3J9IApkZl92aXMgJT4lIAogIGdyb3VwX2J5KEphaHIsIHJlbGV2YW50LCBUaGVtYSkgJT4lIAogIGNvdW50KCkgJT4lIAogIGdncGxvdChhZXMoSmFociwgbiwgZmlsbCA9IFRoZW1hKSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJzdGFjayIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikKYGBgCgoKYGBge3J9CmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBKYWhyLCByZWxldmFudCwgVGhlbWEpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHIsIG4sIGNvbG9yID0gVGhlbWEpKSArCiAgZ2VvbV9wb2ludCgpICsKICBmYWNldF93cmFwKH5KYWhyemVobnQpCgpgYGAKCgpgYGB7cn0gCmRmX3ZpcyAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCByZWxldmFudCwgVGhlbWEpICU+JSAKICBjb3VudCgpICU+JSAKICBnZ3Bsb3QoYWVzKEphaHJ6ZWhudCwgbiwgZmlsbCA9IHJlbGV2YW50KSkgKwogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgCgpnZ3Bsb3QoZGZfdmlzLCBhZXMoSmFociwgVGhlbWEpKSsKICBnZW9tX2NvbCgpCgpgYGAKCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojVmlzdWFsaXNpZXJ1bmdlbgptZWRpYSA8LSBhdXNsw6RuZGVyICU+JQogIHNlbGVjdChLdXJ6dGl0ZWwsIHJlY2h0c2Zvcm0sIG1lZGlhdG9uLmQsIG1lZGlhdG9uLmYsIG1lZGlhdG9uLnRvdCkgCgpnZ3Bsb3QobWVkaWEsIGFlcyhyZWNodHNmb3JtLCBtZWRpYXRvbi50b3QsIG5hLnJtID0gVFJVRSkpICsKICBnZW9tX2JveHBsb3QoKQoKZ2dwbG90KG1lZGlhLCBhZXMoVGl0ZWwsIG1lZGlhdG9uLmQsIG1lZGlhdG9uLmYpKSArCiAgZ2VvbV9qaXR0ZXIoKSAKCnBvcyA8LSBkYXRhX2NkYSAlPiUKICBzZWxlY3QoVGl0ZWwsIG5hbWVzKHBvc2l0aW9uZW4pKQpgYGAKCgpgYGB7cn0KZ2dwbG90KGRmLCBhZXMoSmFocikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oKQoKCmRmICU+JSAKICBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lCiAgZ3JvdXBfYnkoSmFocnplaG50LCBkMWUxKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGZpbGwgPSBkMWUxKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbj0iZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpCmBgYAoKCmBgYHtyfQpkZiAlPiUgCiAgc2VsZWN0KEphaHJ6ZWhudCwgcmVsZXZhbnQpICU+JSAKICBncm91cF9ieShKYWhyemVobnQsIHJlbGV2YW50KSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGNvbG9yID0gcmVsZXZhbnQpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikKCgpkZiAlPiUgCiAgc2VsZWN0KEphaHJ6ZWhudCwgdGl0ZWxfa3Vyel9kKSAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50KSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4pKSArIAogIGdlb21fYmFyKHBvc2l0aW9uPSJkb2RnZSIsIHN0YXQ9ImlkZW50aXR5IikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGU9IlNwZWN0cmFsIikKYGBgCgoKYGBge3J9CmRmICU+JSBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lCiAgc2VsZWN0KEphaHIsIEphaHJ6ZWhudCwgU2ljaGVyaGVpdHNwb2xpdGlrLCBBdXNzZW5wb2xpdGlrLCBBdXNsw6RuZGVyKSAlPiUgCiAgZ3JvdXBfYnkoSmFocikgJT4lIAogIGdncGxvdChhZXMoSmFocikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oKSAKCgoKYGBgCgoKYGBge3J9CmRmICU+JSAKICBtdXRhdGUoSmFocnplaG50ID0gYXMuZmFjdG9yKGZsb29yKEphaHIvMTApKjEwKSkgJT4lCiAgZmlsdGVyKGQxZTF8ZDJlMXxkM2UxICVpbiUgYygiQXVzc2VucG9saXRpayIsICJTaWNoZXJoZWl0c3BvbGl0aWsiLCAiU296aWFscG9saXRpayIpKSAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBkMWUxLCBkMmUxKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGZpbGwgPSBkMWUxKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpCgoKCgpkZiAlPiUgCiAgbXV0YXRlKEphaHJ6ZWhudCA9IGFzLmZhY3RvcihmbG9vcihKYWhyLzEwKSoxMCkpICU+JQogIGZpbHRlcihkMWUxICVpbiUgYygiQXVzc2VucG9saXRpayIsICJTaWNoZXJoZWl0c3BvbGl0aWsiLCAiU296aWFscG9saXRpayIpKSAlPiUgCiAgZ3JvdXBfYnkoSmFocnplaG50LCBkMWUxLCBkMmUxKSAlPiUgCiAgY291bnQoKSAlPiUgCiAgZ2dwbG90KGFlcyhKYWhyemVobnQsIG4sIGZpbGwgPSBkMWUxKSkgKyAKICBnZW9tX2NvbChwb3NpdGlvbj0iZG9kZ2UiLCBzdGF0PSJpZGVudGl0eSIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlPSJTcGVjdHJhbCIpCgpgYGAKCgpgYGB7cn0KZGYgJT4lIAogIG11dGF0ZShKYWhyemVobnQgPSBhcy5mYWN0b3IoZmxvb3IoSmFoci8xMCkqMTApKSAlPiUKICBmaWx0ZXIoZDFlMXxkMmUxfGQzZTEgJWluJSBjKCJBdXNzZW5wb2xpdGlrIiwgIlNpY2hlcmhlaXRzcG9saXRpayIsICJTb3ppYWxwb2xpdGlrIikpICU+JSAKICBncm91cF9ieShkMWUxLCBKYWhyKSAlPiUgCiAgY291bnQoKSAKCgoKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQojU2Fua2V5CmQgPC0gZGYgJT4lIAogIGZpbHRlcihyZWNodHNmb3JtICE9ICJTdGljaGZyYWdlIiwgcmVsZXZhbnQgPT0gImphIikgJT4lIAogIHNlbGVjdChUaGVtYSwgcmVjaHRzZm9ybSwgYnYucG9zLCAgYW5uYWhtZSkKCgpoY2hhcnQoZGF0YV90b19zYW5rZXkoZCksICJzYW5rZXkiLCBuYW1lID0gIlJlc3VsdGF0IikKCgpkMiA8LSBkZiAlPiUgCiAgZmlsdGVyKHJlY2h0c2Zvcm0gIT0gIlN0aWNoZnJhZ2UiLCByZWxldmFudCA9PSAiamEiKSAlPiUgCiAgc2VsZWN0KFRoZW1hLCByZWNodHNmb3JtLCAgcC5zdnAsIGFubmFobWUpICU+JSAKICBkcm9wX25hKC4pCgoKaGNoYXJ0KGRhdGFfdG9fc2Fua2V5KGQyKSwgInNhbmtleSIsIG5hbWUgPSAiUmVzdWx0YXQiKQoKCmQ0IDwtIGRmICU+JSAKICBmaWx0ZXIocmVjaHRzZm9ybSAhPSAiU3RpY2hmcmFnZSIsIFRoZW1hID09ICJBdXNsw6RuZGVyIikgJT4lIAogIHNlbGVjdChUaGVtYSwgcmVjaHRzZm9ybSwgIGJ2LnBvcywgYW5uYWhtZSkgJT4lIAogIGRyb3BfbmEoLikKCgpoY2hhcnQoZGF0YV90b19zYW5rZXkoZDQpLCAic2Fua2V5IiwgbmFtZSA9ICJSZXN1bHRhdCIpCgoKCmQzIDwtIGRmICU+JSAKICBmaWx0ZXIocmVjaHRzZm9ybSAhPSAiU3RpY2hmcmFnZSIpICU+JSAKICBzZWxlY3QocmVjaHRzZm9ybSwgYnIucG9zLCB2b2xrLCBzdGFuZCwgIGFubmFobWUpICU+JSAKICBtdXRhdGUodm9sayA9IGNhc2Vfd2hlbih2b2xrID09ICJhbmdlbm9tbWVuIn4gIkFubmFobWUgVm9sayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sayA9PSAiYWJnZWxlaG50In4gIkFibGVobnVuZyBWb2xrIikpICU+JSAKICBtdXRhdGUoc3RhbmQgPSBjYXNlX3doZW4oc3RhbmQgPT0gImFuZ2Vub21tZW4ifiAiQW5uYWhtZSBTdMOkbmRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmQgPT0gImFiZ2VsZWhudCJ+ICJBYmxlaG51bmcgU3TDpG5kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kID09ICJTdMOkbmRlbWVociBuaWNodCBuw7Z0aWciIH4gIlN0w6RuZGVtZWhyIG5pY2h0IG7DtnRpZyIpKSAlPiUgCiAgZHJvcF9uYSguKQoKCihwbCA8LSBoY2hhcnQoZGF0YV90b19zYW5rZXkoZDMpLCAic2Fua2V5IiwgbmFtZSA9ICJSZXN1bHRhdCIsIHdpZHRoID0gIDUpKSAKcGwgPC0gcGwgJT4lIGhjX3RpdGxlKHRleHQgPSAiWnVzYW1tZW5oYW5nIHp3aXNjaGVuIFBvc2l0aW9uIGRlcyBCdW5kZXNyYXRzIHVuZCBSZXN1bHRhdCBkZXIgQWJzdGltbXVuZyIpICU+JSAKICBoY19zaXplKGhlaWdodCA9IDUwMCwgd2lkdGggPSA2MDApCgpodG1sd2lkZ2V0czo6c2F2ZVdpZGdldCh3aWRnZXQgPSBwbCwgZmlsZSA9ICJDOi9Vc2Vycy9BbnRvbmlhL3Rlc3QuaHRtbCIpCgoKYGBgCgpgYGB7cn0KIyBBbHRlciBjb2RlLWNodW5rCiMgZGZfbmV1IDwtIGRmX2NsZWFuICU+JQojICBmaWx0ZXIoZDFlM3xkMmUzfGQzZTMgJWluJSB0aGVtZW4pICU+JQojICBzZWxlY3RfaWYofnN1bSghaXMubmEoLikpID4gMCkgJT4lICNudXIgU3BhbHRlbiB3w6RobGVuLCBkaWUgbmljaHQgenUgMTAwJSBOQXMgc2luZAojICByb3d3aXNlKCkgJT4lCiMgIG11dGF0ZShhbGxlX2thdCA9IGxpc3QoYyhkMWUzLCAgZDJlMywgIGQzZTMpKSkgJT4lCiMgIG11dGF0ZShhbGxlX2thdCA9IGxpc3QoYWxsZV9rYXRbIWlzLm5hKGFsbGVfa2F0KV0pKSAKYGBgCgpgYGB7cn0KCnZvbGtqYV9wcm96X3RhYiA8LSBzZWxlY3QoZGYsYW5yLCB2b2xramEucHJveikKCmF1c19hbnIgPC0gc2VsZWN0KGF1c2zDpG5kZXIsIGFucikKYXVzX2FuciA9IGF1c19hbnJbYXVzX2FuclsnYW5yJ10gIT0gIjU1Mi4zIl0KYXVzX2FuciA8LSBhcy5kYXRhLmZyYW1lKGF1c19hbnIpICU+JSAKICByZW5hbWUoYW5yPWF1c19hbnIpCiNmbHVfYW5yIDwtIHNlbGVjdChmbMO8Y2h0bGluZywgYW5yKQojYW5yX3RvdCA8LSBiaW5kX3Jvd3MoYXVzX2FuciwgZmx1X2FucikgCiNhbnJfdG90IDwtIHRyYW5zZm9ybShhbnJfdG90LCBhbnIgPSBhcy5udW1lcmljKGFucikpCiNhbnJfdG90IDwtIGFycmFuZ2UoYW5yX3RvdCwgYW5yKQoKI3ZvbGtqYV9wcm96X3RhYiA8LSB0cmFuc2Zvcm0odm9sa2phX3Byb3pfdGFiLCBhbnIgPSBhcy5udW1lcmljKGFucikpCgp0aGVtYV92b2xrIDwtIGlubmVyX2pvaW4oYXVzX2Fuciwgdm9sa2phX3Byb3pfdGFiKQp0aGVtYV92b2xrJGFuciA8LSBOVUxMCgojdGhlbWFfdm9sayRhbnIgPC0gTlVMTAoKI2JpbmRfY29scyh0aGVtYV92b2xrLCBrYW50b25lX2phcHJvel9rb3JyKQpgYGAKCgpgYGB7cn0Ka29ycmVrdHVyIDwtIGMoMCwwLDAsMCwwLDAsMCwxMDAsMTAwLDAsMCwwLDEwMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTAwKQprYW50b25lX2phcHJvel9rb3JyIDwtIGRhdGEuZnJhbWUoa2FudG9uZV9qYXByb3opCmthbnRvbmVfamFwcm96X2tvcnIgPC0gYmluZF9jb2xzKGthbnRvbmVfamFwcm96X2tvcnIsIHRoZW1hX3ZvbGspCgpmb3IgKGkgaW4gMTpsZW5ndGgoa2FudG9uZV9qYXByb3pfa29ycikpIHsKICBrYW50b25lX2phcHJvel9rb3JyWyxpXSA8LSBhYnMoa2FudG9uZV9qYXByb3pfa29yclssaV0gLWtvcnJla3R1cikKfQoKa2FudG9uZV9qYXByb3pfa29yciRqdS5qYXByb3ogPC0gTlVMTAprYW50b25lX2phcHJvel9tZWFuIDwtIGRhdGEuZnJhbWUoY29sTWVhbnMoa2FudG9uZV9qYXByb3pfa29ycikpCmthbnRvbmVfamFwcm96X21lYW4gPC0ga2FudG9uZV9qYXByb3pfbWVhbiAlPiUgCiAgbXV0YXRlKGNvbnRyYV92ZXJzY2jDpHJmdW5nID0gMTAwLSBrYW50b25lX2phcHJvel9tZWFuJGNvbE1lYW5zLmthbnRvbmVfamFwcm96X2tvcnIuKQoKa2FudG9uZV9qYXByb3pfbWVhbiA8LSBrYW50b25lX2phcHJvel9tZWFuICU+JSAKICByZW5hbWUocHJvX3ZlcnNjaMOkcmZ1bmcgPSBjb2xNZWFucy5rYW50b25lX2phcHJvel9rb3JyLikKCmthbnRvbmVfamFwcm96X21lYW5bIkthbnRvbmUiXSA8LSByb3duYW1lcyhrYW50b25lX2phcHJvel9tZWFuKQoKa2FudG9uZV9qYXByb3pfbWVhbiA8LSBrYW50b25lX2phcHJvel9tZWFuICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gcHJvX3ZlcnNjaMOkcmZ1bmc6Y29udHJhX3ZlcnNjaMOkcmZ1bmcsIAogICAgbmFtZXNfdG8gPSAiUG9zaXRpb24iLCAKICAgIHZhbHVlc190byA9ICJQcm96ZW50IgopCgp2ZXJzY2jDpHJmdW5nIDwtIGdncGxvdChrYW50b25lX2phcHJvel9tZWFuLCBhZXMoeD1yZW9yZGVyKEthbnRvbmUsIFByb3plbnQpLCB5PVByb3plbnQsIGZpbGw9UG9zaXRpb24pKSsKICBnZW9tX2Jhcihwb3NpdGlvbj0ic3RhY2siLCBzdGF0ID0gImlkZW50aXR5IikrCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpnZ3Bsb3RseSh2ZXJzY2jDpHJmdW5nKQpgYGAKCgpgYGB7cn0KdGVzdCA8LSBhdXNsw6RuZGVyICU+JSAKICBzZWxlY3QoS3VyenRpdGVsLCB6aGphLnByb3opCgoKCgpgYGAKCmBgYHtyfQp4bHN4RmlsZSA8LSAiaHR0cHM6Ly93d3cuc2VtLmFkbWluLmNoL2RhbS9zZW0vZGUvZGF0YS9wdWJsaXNlcnZpY2Uvc3RhdGlzdGlrL2FzeWxzdGF0aXN0aWsvdWViZXJzaWNodGVuL2dlc3VjaGUtbmF0aW9uLWFiLTE5ODYtZC54bHN4LmRvd25sb2FkLnhsc3gvZ2VzdWNoZS1uYXRpb24tYWItMTk4Ni1kLnhsc3giCmFzX25hdGlvbiA8LSByZWFkLnhsc3goeGxzeEZpbGUpCmFzX25hdGlvblsxLDFdIDwtICJDb3VudHJ5Igphc19uYXRpb25bMSwzOF0gPC0gIjIwMjIiCmFzLmNoYXJhY3Rlcihhc19uYXRpb25bMSwgXSkKbmFtZXMoYXNfbmF0aW9uKSA8LSBhc19uYXRpb25bMSxdCmFzX25hdGlvbiA8LSBhc19uYXRpb25bLTEsXQp0b3RhbCA8LSBhc19uYXRpb25bMTg2LF0KYXNfbmF0aW9uIDwtIGFzX25hdGlvblstMTg2LF0KCmBgYAoKYGBge3J9CmN1bV9uYXQgPC0gYXNfbmF0aW9uICU+JSAKICBwaXZvdF9sb25nZXIoCiAgICBjb2xzID0gIjE5ODYiOiIyMDIyIiwKICAgIG5hbWVzX3RvID0gIkphaHIiLCAKICAgIHZhbHVlc190byA9ICJBbnphaGwiCiAgKQoKY3VtX25hdCA8LSB0cmFuc2Zvcm0oY3VtX25hdCwgQW56YWhsID0gYXMubnVtZXJpYyhBbnphaGwpKQoKdG9wX2xhbmQgPC0gYWdncmVnYXRlKGN1bV9uYXQkQW56YWhsLCBieT1saXN0KExhbmQ9Y3VtX25hdCRDb3VudHJ5KSwgRlVOPXN1bSkKdG9wX2xhbmQgPC0gdG9wX2xhbmQgJT4lIAogIGFycmFuZ2UoZGVzYyh4KSkgJT4lIAogIHVuZ3JvdXAoKQoKbGFlbmRlciA8LSBhc19uYXRpb25bLDFdCgp0b3BfMjAgPC0gdG9wX2xhbmQgJT4lIAogIG11dGF0ZShMYW5kPWlmZWxzZShMYW5kICVpbiUgaGVhZChMYW5kLCAyMCksIAogICAgICAgICAgICAgICAgICAgICBMYW5kLCAiQW5kZXJlIikpCnRvcF8yMCA8LSBhZ2dyZWdhdGUodG9wXzIwJHgsIGJ5PWxpc3QoSGVya3VuZnRzbGFuZD10b3BfMjAkTGFuZCksIEZVTj1zdW0pCmBgYAoKCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9Cgphc19uYXRpb25bMjozOF0gPC0gc2FwcGx5KGFzX25hdGlvblsyOjM4XSxhcy5udW1lcmljKQpzYXBwbHkoYXNfbmF0aW9uLCBjbGFzcykKCmN1bV9uYXQgPC0gdHJhbnNmb3JtKGN1bV9uYXQsIEFuemFobCA9IGFzLm51bWVyaWMoQW56YWhsKSkKCgoKdG9wX2xhbmQgPC0gYWdncmVnYXRlKGN1bV9uYXQkQW56YWhsLCBieT1saXN0KExhbmQ9Y3VtX25hdCRDb3VudHJ5KSwgRlVOPXN1bSkKdG9wX2xhbmQgPC0gdG9wX2xhbmQgJT4lIAogIGFycmFuZ2UoZGVzYyh4KSkgJT4lIAogIHVuZ3JvdXAoKQoKbGFlbmRlciA8LSBhc19uYXRpb25bLDFdCgp0b3BfMjAgPC0gdG9wX2xhbmQgJT4lIAogIG11dGF0ZShMYW5kPWlmZWxzZShMYW5kICVpbiUgaGVhZChMYW5kLCAyMCksIAogICAgICAgICAgICAgICAgICAgICBMYW5kLCAiQW5kZXJlIikpCnRvcF8yMCA8LSBhZ2dyZWdhdGUodG9wXzIwJHgsIGJ5PWxpc3QoSGVya3VuZnRzbGFuZD10b3BfMjAkTGFuZCksIEZVTj1zdW0pCiNnZ3Bsb3QoY3VtX25hdCwgYWVzKHg9SmFociwgeT1BbnphaGwsIGZpbGw9Q291bnRyeSkpKwogIyBnZW9tX2FyZWEoKQpgYGAK